package com.spring.boot.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.spring.boot.dao.CollectAndPayMapper;
import com.spring.boot.dao.ContractMapper;
import com.spring.boot.entity.CollectAndPay;
import com.spring.boot.entity.Contract;
import com.spring.boot.service.CollectAndPayService;
import com.spring.boot.service.ContractService;
import com.spring.boot.utils.ServiceException;
import com.spring.boot.vo.CollectAndPayVO;
import com.spring.boot.vo.StatisticsVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Author: Daniel ZTQ
 * @Date: 2021/01/01 22:59
 * @Description: 日结账业务逻辑层 接口实现
 */
@Slf4j
@Service
public class CollectAndPayServiceImpl extends ServiceImpl<CollectAndPayMapper, CollectAndPay> implements CollectAndPayService {

    @Autowired
    private CollectAndPayMapper collectAndPayMapper;

    /**
     * 日结账
     */
    @Override
    public Map<String, Object> findCollectAndPayByDate(String date) {
        //定义map对象
        Map<String, Object> result = new HashMap<>();
        //创建一个list对象
        List<CollectAndPayVO> list = new ArrayList<CollectAndPayVO>();
        //如果日期为空，
        if (StringUtils.isBlank(date)) {
            //创建时间格式对象
            Calendar cal = Calendar.getInstance();
            //获取当前时间
            cal.add(Calendar.DATE, 0);
            //按照日期规则获取日期
            date = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());

        }
        //定义日结账对象
        CollectAndPayVO collectAndPayVO = new CollectAndPayVO();
        //保留3位小数
        DecimalFormat df = new DecimalFormat("#.000");
        try {
            //判断入参是否为空
            boolean notBlank = StringUtils.isNotBlank(date);
            //如果不为空
            if (notBlank) {
                //获取财务当日收入金额
                Double incomeMoney = collectAndPayMapper.getIncomeMoney(date);
                //如果当日没有收益
                if (incomeMoney == null) {
                    //设置收入金额为0.0
                    incomeMoney = 0.0;
                }
                //获取财务当日支出金额
                Double expenditureMoney = collectAndPayMapper.getExpenditureMoney(date);
                //如果当日没有支出
                if (expenditureMoney == null) {
                    //设置支出金额为0.0
                    expenditureMoney = 0.0;
                }
                //当日总金额
                Double totalAmount = incomeMoney - expenditureMoney;
                //保留总金额三位小数
                String format = df.format(totalAmount);
                //String类型转换成Double类型
                totalAmount = Double.parseDouble(format);
                //设置日期
                collectAndPayVO.setDate(date);
                //设置当日收入金额
                collectAndPayVO.setIncomeMoney(incomeMoney.toString());
                //设置当日支出金额
                collectAndPayVO.setExpenditureMoney(expenditureMoney.toString());
                //设置当日总金额
                collectAndPayVO.setTotalAmount(totalAmount.toString());
                list.add(collectAndPayVO);
                //日志打印
                log.info("查询日结账成功！");
                //设置状态码
                result.put("code", 200);
                //设置data值
                result.put("data", list);
                //设置msg值
                result.put("msg", "查询日结账成功！");
                //设置status值
                result.put("status", true);
            } else {
                //如果为空
                //打印日志
                log.error("查询日期不能为空！");
                //设置状态码
                result.put("code", 300);
                //设置msg值
                result.put("msg", "查询日期不能为空！");
                //设置status值
                result.put("status", false);

            }
        } catch (Exception e) {
            //打印日志
            log.error("查询日结账失败:", e);
            //设置状态码
            result.put("code", 500);
            //设置msg值
            result.put("msg", "查询日结账失败！");
            //设置status值
            result.put("status", false);
            //抛出异常
            throw new ServiceException("查询日结账失败！");
        }
        return result;
    }


    /**
     * 统计 收入笔数、理赔笔数
     */
    @Override
    public Map<String, Object> Statistics() {
        //定义map对象
        Map<String, Object> result = new HashMap<>();
        try {
            //调用collectAndPayMapper层的getStatistics的sql 获取统计数据信息
            List<StatisticsVO> statistics = collectAndPayMapper.getStatistics();
            //创建一个map包list的对象
            Map<String, List<StatisticsVO>> map = new HashMap<>();
            //for循环遍历
            for (StatisticsVO statisticsVO:statistics){
                //获取建档时间
                String createdTime = statisticsVO.getCreatedTime();
                //判断，如果创建时间不存在map中
                if (!map.containsKey(createdTime)){
                    //创建list对象
                    List<StatisticsVO> vos = new ArrayList<>();
                    //将数据进行添加
                    vos.add(statisticsVO);
                    //并且根据时间进行封装对象
                    map.put(createdTime,vos);
                }else{
                    //如果创建时间荀子啊map中
                    List<StatisticsVO> voList = map.get(createdTime);
                    //则将数据添加到list里面
                    voList.add(statisticsVO);
                }
            }
            //创建list对象
            List<StatisticsVO> arrayList = new ArrayList<>();
            //进行for循环遍历map数据
            for (String k:map.keySet()){
                //获取map中的创建时间
                List<StatisticsVO> statisticsVOList = map.get(k);
                //如果只有一条数据
                if (statisticsVOList.size()==1) {
                    //获取第一条数据
                    StatisticsVO statisticsVO = statisticsVOList.get(0);
                    //获取收付款类型
                    String type = statisticsVO.getType();
                    //创建对象
                    StatisticsVO newSta = new StatisticsVO();
                    //如果为1
                    if ("1".equals(type)) {
                        //则补全0
                        newSta.setType("0");
                    } else {
                        //否则补全1
                        newSta.setType("1");
                    }
                    //设置数量为0
                    newSta.setNumber("0");
                    //设置建档时间
                    newSta.setCreatedTime(statisticsVO.getCreatedTime());
                    //将数据添加到statisticsVOList集合里面
                    statisticsVOList.add(newSta);
                    //将数据添加到arrayList里面
                    arrayList.addAll(statisticsVOList);
                }else{
                    //否则返回全部新
                    arrayList.addAll(statisticsVOList);
                }
            }

            //日志打印
            log.info("查询统计数据成功！");
            //设置状态码
            result.put("code", 200);
            //设置data值
            result.put("data", arrayList);
            //设置msg值
            result.put("msg", "查询统计数据成功！");
            //设置status值
            result.put("status", true);
        } catch (Exception e) {
            //打印日志
            log.error("查询统计数据失败:", e);
            //设置状态码
            result.put("code", 500);
            //设置msg值
            result.put("msg", "查询统计数据失败！");
            //设置status值
            result.put("status", false);
            //抛出异常
            throw new ServiceException("查询统计数据失败！");
        }
        return result;
    }
}
